from .exts import db

# 多对多关系的建立
# 	1. 先把两个需要做多对多的模型定义出来
# 	2. 使用Table定义一个中间表，中间表一般就是包含两个模型的外键字段就可以了，并且让他们两个来作为一个“复合主键”。
# 	3. 在两个需要做多对多的模型中随便选择一个模型，定义一个relationship属性，来绑定三者之间的关系，在使用relationship的时候，需要传入一个secondary=中间表模型名。

# 创建一个项目, 用来说明出版社, 书籍和作者的关系。
# 假定关系：作者：书籍 => 1:n  （一本书由一个作者完成， 一个作者可以创作多本书）
# 		 出版社：书籍 => n:n  （一个出版社可以出版多本书， 一本书可以由多个出版社出版）

# 作者
class Author(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(30))
    age = db.Column(db.Integer, default=1)
    sex = db.Column(db.Boolean, default=True)
    email = db.Column(db.String(200))
    # 关系
    books = db.relationship('Book', backref='auther', lazy='dynamic')


# 书籍
class Book(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    title = db.Column(db.String(100), unique=True)
    date = db.Column(db.DateTime)
    # 1对多，外键
    author_id = db.Column(db.Integer, db.ForeignKey(Author.id))


# 中间表（书籍-出版社）
book_publisher = db.Table(
    'book_publisher',
    db.Column('book_id', db.Integer,
              db.ForeignKey('book.id'), primary_key=True),
    db.Column('publisher_id', db.Integer,
              db.ForeignKey('publisher.id'), primary_key=True)
)


# 出版社
class Publisher(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(20), unique=True)
    address = db.Column(db.String(200))
    city = db.Column(db.String(100))
    province = db.Column(db.String(100))
    country = db.Column(db.String(100))
    website = db.Column(db.String(100))
    # 多对多, 关联book表
    books = db.relationship('Book', backref='publishers',
                            secondary=book_publisher, lazy='dynamic')


# 自己随便写的一个多对多的测试。 一本书有多个作者， 一个作者写多本书。  n === m
# 员工和部门之间的关系： 一个员工可以有多个部门，一个部门有多个员工 (不知道是否正确)
class Employee(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    employee_name = db.Column(db.String(20), unique=True)
    age = db.Column(db.Integer, default=1)
    salary = db.Column(db.Integer)
    address = db.Column(db.String(200))
    email = db.Column(db.String(200))
    phone = db.Column(db.String(200))


# 中间表

employee_department = db.Table(
    'employee_department',
    db.Column('employee_id',db.Integer, db.ForeignKey('employee.id'), primary_key=True),
    db.Column('department_id',db.Integer, db.ForeignKey('department.id'), primary_key=True),
)

class Department(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    department_name = db.Column(db.String(20), unique=True)
    department_no = db.Column(db.Integer)
    employees = db.relationship('Employee', backref='departments',
                                secondary=employee_department, lazy='dynamic')

